<?php

namespace backend\modules\rbac\controllers;

use Yii;
use yii\filters\VerbFilter;
use yii\web\Response;
use common\helpers\ArrayHelper;
use common\models\rbac\Menu;
use common\models\rbac\Route;

/**
 * Description of RuleController
 *
 * @author emhome <emhome@163.com>
 * @since 1.0
 */
class RouteController extends \mdm\admin\controllers\RouteController {

    public function behaviors() {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'create' => ['post'],
                    'assign' => ['post'],
                    'remove' => ['post'],
                    'refresh' => ['post'],
                ],
            ],
        ];
    }

    /**
     * Lists all Route models.
     * @return mixed
     */
    public function actionIndex() {
        $model = new Route();
        return $this->render('index', ['routes' => $model->getRoutes()]);
    }

    /**
     * Creates a new AuthItem model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate() {
        Yii::$app->getResponse()->format = Response::FORMAT_JSON;
        $routes = Yii::$app->getRequest()->post('route', '');

        $model = new Route();
        $model->addNew(preg_split('/\s*,\s*/', trim($routes), -1, PREG_SPLIT_NO_EMPTY));
        return $model->getRoutes();
    }

    /**
     * Assign routes
     * @return array
     */
    public function actionAssign() {
        $routes = Yii::$app->getRequest()->post('routes', []);
        $model = new Route();
        $model->addNew($routes);
        Yii::$app->getResponse()->format = Response::FORMAT_JSON;
        return $model->getRoutes();
    }

    /**
     * Remove routes
     * @return array
     */
    public function actionRemove() {
        $routes = Yii::$app->getRequest()->post('routes', []);
        $model = new Route();
        $model->remove($routes);
        Yii::$app->getResponse()->format = Response::FORMAT_JSON;
        return $model->getRoutes();
    }

    /**
     * Refresh cache
     * @return type
     */
    public function actionRefresh() {
        $model = new Route();
        $model->invalidate();
        Yii::$app->getResponse()->format = Response::FORMAT_JSON;
        return $model->getRoutes();
    }

    /**
     * Creates a new AuthItem model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionReload() {
        $model = new Route();
        $model->refresh();
        return $this->redirect(Yii::$app->request->referrer ? Yii::$app->request->referrer : ['index']);
    }

    /**
     * Creates a new AuthItem model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionFilter() {
        $model = new Route();
        $model->filterRoutes();
        return $this->redirect(Yii::$app->request->referrer ? Yii::$app->request->referrer : ['index']);
    }

    /**
     * Refresh cache
     * @return type
     */
    public function actionPushToMenu() {
        $model = new Route();
        $model->invalidate();
        Yii::$app->getResponse()->format = Response::FORMAT_JSON;
        $routes = $model->getRoutes();
        $assigned = $routes['assigned'];

        $saved = ArrayHelper::map(Menu::findAll(['route' => array_values($assigned)]), 'route', 'route');
        if (!empty($saved)) {
            $assigned = ArrayHelper::diffrent($assigned, $saved);
        }

        $i = 0;
        $error = [];
        foreach ($assigned as $r) {
            $menu = Menu::findOne(['route' => $r]);
            if ($menu == null) {
                $menu = new Menu();
                $menu->attributes = [
                    'name' => str_replace('/', '.', trim($r, '/')),
                    'route' => $r
                ];
            }
            if (str_replace($model->filterWords, '', $r) !== $r) {
                $menu->visibled = 0;
            }
            if ($menu->save()) {
                $i++;
            } else {
                $error[] = $menu->attributes;
            }
        }

        return [
            'nums' => $i,
            'error' => $error
        ];
    }

}
